<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

namespace common\components\wechat\models;

use Yii;

/**
 * 数据对象基础类，该类中定义数据类最基本的行为，包括：
 * 计算/设置/获取签名、输出xml格式的参数、从xml读取数据对象等
 *
 * @author emhome
 */
class BasePayment extends BaseModel {

    /**
     * 微信公众账号ID
     * @param String(32) $appid 
     */
    public $appid;

    /**
     * 微信支付分配的商户号
     * @param String(32) $mch_id 
     */
    public $mch_id;

    /**
     * 随机字符串，不长于32位。推荐随机数生成算法
     * @param String(32) $nonce_str 
     */
    public $nonce_str;

    /**
     * 设置签名，详见签名生成算法
     * @param string $value 
     */
    public $sign;

    /**
     * 签名类型
     * 默认为MD5，支持HMAC-SHA256和MD5。
     * @param String(32) $sign_type 
     */
    public $sign_type = 'MD5';

    public function __construct($config = array()) {
        parent::__construct($config);
        if ($this->model == null) {
            throw new \yii\base\InvalidParamException('缺少必要参数，支付发起失败！');
        }
        $this->setAttributes($this->model->paymentConfig);
        $this->setNonceStr();
        $this->generateSign($this->sign);
    }

    /**
     * 交易中心统一下单请求参数校验
     * @inheritdoc
     */
    public function rules() {
        return [
            [['appid', 'mch_id', 'nonce_str', 'sign'], 'required'],
            [['appid', 'mch_id', 'nonce_str', 'sign', 'sign_type'], 'string', 'max' => 32],
            //校验APPID
            ['sign_type', 'in', 'range' => ['MD5', 'HMAC-SHA256', 'MD5']],
        ];
    }

    /**
     * 获取设置的值
     */
    public function setNonceStr() {
        return $this->nonce_str = Yii::$app->security->generateRandomString(32);
    }

}
